var express = require("express")
var router = express.Router()
const { Article } = require("../models")
const { Op } = require('sequelize');
const { success, failure, NotFoundError } = require("../utils/response")

// 查询文章列表
router.get("/", async function (req, res, next) {
    try {
        const { query } = req

        // 当前页码
        const currentPage = Math.abs(Number(query.currentPage)) || 1
        // 每页显示条数
        const pageSize = Math.abs(Number(query.pageSize)) || 10
        // 计算offset
        const offset = (currentPage - 1) * pageSize

        // 定义查询条件
        const condition = {
            order: [["id", "DESC"]],
            limit: pageSize,
            offset,
        }

        // 模糊查询
        if (query.title) {
            condition.where = {
                title: {
                    [Op.like]: `%${query.title}%`,
                },
            }
        }

        // 查询数据
        // const articles = await Article.findAll(condition)
        // const articles = await Article.findAll()

        // count 为数据总数，rows 为当前查询到的数据
        const { count, rows } = await Article.findAndCountAll(condition)

        // 返回查询结果
        // res.json({
        //     status: true,
        //     message: "查询文章列表成功",
        //     data: {
        //         articles: rows,
        //         pagination: { total: count, currentPage, pageSize },
        //     },
        // })
        success(res, "查询文章列表成功", {
            articles: rows,
            pagination: { total: count, currentPage, pageSize },
        })
    } catch (err) {
        // res.status(500).json({
        //     status: false,
        //     message: "查询文章列表失败",
        //     errors: [err.message],
        // })
        failure(res, err)
    }
})

// 查询文章详情
router.get("/:id", async function (req, res, next) {
    try {
        // 获取参数 - 文章ID
        const { id } = req.params

        // 查询数据
        const article = await Article.findByPk(id)

        // 返回查询结果
        if (article) {
            // res.json({
            //     status: true,
            //     message: "查询文章详情成功",
            //     data: { article },
            // })
            success(res, "查询文章详情成功", { article })
        }
        else {
            throw new NotFoundError('文章不存在')
            // return res.status(404).json({
            //     status: false,
            //     message: "文章不存在",
            // })
        }
    } catch (err) {
        // res.status(500).json({
        //     status: false,
        //     message: "查询文章详情失败",
        //     errors: [err.message],
        // })
        failure(res, err)
    }
})



// 新增
// 白名单过滤 - 获取请求参数
function getBody(req) {
    return {
        title: req.body.title,
        content: req.body.content,
    }
}

router.post("/", async function (req, res, next) {
    const body = getBody(req)
    try {
        // 创建数据
        const article = await Article.create(body)

        // 返回创建结果
        // res.status(201).json({
        //     status: true,
        //     message: "创建文章成功",
        //     data: article,
        // })
        success(res, "创建文章成功。", { article }, 201)
    } catch (err) {
        failure(res, err)
        // if (err.name === "SequelizeValidationError") {
        //     const errors = err.errors.map((error) => error.message)
        //     res.status(400).json({
        //         status: false,
        //         message: "创建文章失败",
        //         errors,
        //     })
        // } else {
        //     res.status(500).json({
        //         status: false,
        //         message: "创建文章失败",
        //         errors: [err.message],
        //     })
        // }
    }
})

// 删除文章
router.delete("/:id", async function (req, res, next) {
    try {
        // 获取参数 - 文章ID
        const { id } = req.params

        // 查询数据
        const article = await Article.findByPk(id)

        if (article) {
            // 删除数据
            await Article.destroy({ where: { id } })
            // 返回删除结果
            // res.json({
            //     status: true,
            //     message: "删除文章成功",
            // })
            success(res, "删除文章成功")
        } else {
            throw new NotFoundError('文章不存在')
            // return res.status(404).json({
            //     status: false,
            //     message: "文章不存在",
            // })
        }
    } catch (err) {
        failure(res, err)
        // res.status(500).json({
        //     status: false,
        //     message: "删除文章失败",
        //     errors: [err.message],
        // })
    }
})

// 更新文章
router.put("/:id", async function (req, res, next) {
    const body = getBody(req)

    try {
        // 获取参数 - 文章ID
        const { id } = req.params

        // 查询数据
        const article = await Article.findByPk(id)

        if (article) {
            // 更新数据
            await article.update(body)
            // 返回更新结果
            // res.json({
            //     status: true,
            //     message: "更新文章成功",
            // })
            success(res, "更新文章成功", { article })
        } else {
            throw new NotFoundError('文章不存在')
            // return res.status(404).json({
            //     status: false,
            //     message: "文章不存在",
            // })
        }
    } catch (err) {
        failure(res, err)
        // res.status(500).json({
        //     status: false,
        //     message: "更新文章失败",
        //     errors: [err.message],
        // })
    }
})


module.exports = router
